CSP problem solving is well known to skilled art workers and there are many known ways of reducing the time required to solve many complex problems. In general, CSP problem solving can be succinctly stated as follows:
Given a set of variables {X1, X2, . . . , Xn},
where each variable Xi has a domain Di of possible values,
and there are a set of constraints {C1, C2, . . . , Cp}, where each constraint Ci involves a subset of the variables and specifies allowable combinations of the values of these variables, then find an allowable value for every variable such that all constraints are satisfied.
FIG. 1 shows an example nodal tree that models a fictional CSP problem. Node trees are typically used to model a CSP problem. Each node S is corresponds to a variable Xi and is assigned an ordered sequence of possible values from domain Di. An order of node evaluation is also assigned. Typically, a node evaluation sequence might be to evaluate all nodes in each tree leg left to right until all nodes evaluate as FALSE or a leaf node evaluates as TRUE. When a leaf node evaluates as TRUE, a solution is found to the problem. Thus, in FIG. 1, the variable assigned to node S0 is evaluated against each ordered value in domain D21 and each constraint Ci until one value evaluates as TRUE over all constraints or the domain is exhausted. Assuming that a TRUE value is found for S0, the typical algorithm then moves down a leg eventually to test the leaf nodes such as S3.1 and S3.1. Assuming that all evaluations of any node is FALSE, then the typical algorithm backtracks to evaluate a new leg, which might be the leg starting with node S1.2 in this example. In real life CSP problems, the number of nodes, variables and constraints can be very large and, despite known ways of heuristically removing some nodes and constraints, a solution, if it exists, can consume a lot of time and resources.